export function currency(value: number, fractionDigits = 2) {
	return (value / 100).toFixed(fractionDigits);
}

/**
 * 使用 Haversine 公式计算两个经纬度点之间的距离
 * @param {number} lat1 - 第一个点的纬度
 * @param {number} lng1 - 第一个点的经度
 * @param {number} lat2 - 第二个点的纬度
 * @param {number} lng2 - 第二个点的经度
 * @param {string} unit - 距离单位：'km'（千米）、'miles'（英里）、'nautical'（海里）
 * @returns {number} 两点之间的距离
 */
export function calculateDistance(lat1: number, lng1: number, lat2: number, lng2: number, unit: string = 'km'): number {
	// 验证输入参数
	if (typeof lat1 !== 'number' || typeof lng1 !== 'number' || typeof lat2 !== 'number' || typeof lng2 !== 'number') {
		throw new Error('所有坐标参数必须是数字');
	}

	if (lat1 < -90 || lat1 > 90 || lat2 < -90 || lat2 > 90) {
		throw new Error('纬度范围应在 -90° 到 90° 之间');
	}

	if (lng1 < -180 || lng1 > 180 || lng2 < -180 || lng2 > 180) {
		throw new Error('经度范围应在 -180° 到 180° 之间');
	}

	// 地球半径（千米）
	const R = 6371;

	// 将角度转换为弧度
	const toRadians = (degree) => (degree * Math.PI) / 180;

	const dLat = toRadians(lat2 - lat1);
	const dLng = toRadians(lng2 - lng1);

	const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * Math.sin(dLng / 2) * Math.sin(dLng / 2);

	const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
	let distance = R * c;

	// 根据单位转换距离
	switch (unit.toLowerCase()) {
		case 'miles':
			distance *= 0.621371;
			break;
		case 'nautical':
			distance *= 0.539957;
			break;
		case 'km':
		default:
			// 保持千米单位
			break;
	}

	return distance;
}

export function groupBy(array: any, keys: string[]) {
	let groups = [];
	for (let i = 0; i < array.length; i++) {
		const element = array[i];
		const finded = groups.find((item: any) => {
			let result = true;
			keys.forEach((key) => {
				if (item[key] !== element[key]) {
					result = false;
				}
			});
			return result;
		});
		if (finded) {
			finded.children.push(element);
		} else {
			let groupKey = {};
			keys.forEach((key) => {
				groupKey[key] = element[key];
			});
			groups.push({
				...groupKey,
				children: [{ ...element }]
			});
		}
	}
	return groups;
}
